/*
 * Copyright © 2025 上海火金网络科技有限公司. All rights reserved.
 * 权限树数据处理工具函数
 */

import type { Permission, EnhancedPermission, TreeDataProcessor } from './types';

/**
 * 检查节点是否有子节点
 * @param permission 权限节点
 * @returns 是否有子节点
 */
export function hasChildren(permission: Permission): boolean {
  return Array.isArray(permission.children) && permission.children.length > 0;
}

/**
 * 计算节点层级深度
 * @param permission 当前权限节点
 * @param allPermissions 所有权限数据（扁平化）
 * @param currentLevel 当前层级（内部使用）
 * @returns 节点层级深度（从0开始）
 */
export function calculateNodeLevel(
  permission: Permission, 
  allPermissions: Permission[], 
  currentLevel: number = 0
): number {
  // 如果是根节点（parentId为0或null），返回当前层级
  if (!permission.parentId || permission.parentId === 0) {
    return currentLevel;
  }

  // 查找父节点
  const parent = allPermissions.find(p => p.id === permission.parentId);
  if (!parent) {
    // 如果找不到父节点，可能是数据不完整，返回当前层级
    return currentLevel;
  }

  // 递归计算父节点的层级
  return calculateNodeLevel(parent, allPermissions, currentLevel + 1);
}

/**
 * 为权限数据添加树相关属性
 * @param permissions 原始权限数据
 * @returns 增强后的权限数据
 */
export function enhancePermissionData(permissions: Permission[]): EnhancedPermission[] {
  // 创建扁平化的权限映射，用于快速查找
  const flatPermissions = flattenPermissions(permissions);
  
  return permissions.map(permission => enhancePermissionNode(permission, flatPermissions));
}

/**
 * 增强单个权限节点
 * @param permission 权限节点
 * @param flatPermissions 扁平化的权限数据
 * @returns 增强后的权限节点
 */
function enhancePermissionNode(
  permission: Permission, 
  flatPermissions: Permission[]
): EnhancedPermission {
  const enhanced: EnhancedPermission = {
    ...permission,
    hasChildren: hasChildren(permission),
    level: calculateNodeLevel(permission, flatPermissions),
    isExpanded: false // 默认折叠状态
  };

  // 递归处理子节点
  if (enhanced.children && enhanced.children.length > 0) {
    enhanced.children = enhanced.children.map(child => 
      enhancePermissionNode(child, flatPermissions)
    ) as EnhancedPermission[];
  }

  return enhanced;
}

/**
 * 将树形权限数据扁平化
 * @param permissions 树形权限数据
 * @returns 扁平化的权限数组
 */
function flattenPermissions(permissions: Permission[]): Permission[] {
  const result: Permission[] = [];
  
  function traverse(nodes: Permission[]) {
    for (const node of nodes) {
      result.push(node);
      if (node.children && node.children.length > 0) {
        traverse(node.children);
      }
    }
  }
  
  traverse(permissions);
  return result;
}

/**
 * 扁平化增强的树数据（用于表格显示）
 * @param permissions 增强的权限树数据
 * @returns 扁平化的增强权限数组
 */
export function flattenTreeData(permissions: EnhancedPermission[]): EnhancedPermission[] {
  const result: EnhancedPermission[] = [];
  
  function traverse(nodes: EnhancedPermission[]) {
    for (const node of nodes) {
      result.push(node);
      if (node.children && node.children.length > 0) {
        traverse(node.children as EnhancedPermission[]);
      }
    }
  }
  
  traverse(permissions);
  return result;
}

/**
 * 树数据处理器实现
 */
export const treeDataProcessor: TreeDataProcessor = {
  enhancePermissionData,
  calculateNodeLevel,
  hasChildren,
  flattenTreeData
};